package com.zijidelu.luframework.base.dict;

import com.zijidelu.luframework.base.exception.sys.DictTranslationException;
import com.zijidelu.luframework.base.TypeCaster;

import java.util.Collections;
import java.util.List;

/**
 * 可翻译接口。
 * <p>
 * 需要翻译的对象必须实现此接口。
 *
 * @author ZIJIDELU
 * @datetime 2025/10/16 10:33
 */
public interface DictTranslatable {
    /**
     * 获取字典编排配置列表
     *
     * @return 字典编排配置列表
     */
    default List<DictMapping<?, ?, ?>> dictMapping() {
        return Collections.emptyList();
    }

    /**
     * 处理字典编排配置
     * <p>
     * 遍历所有字典编排配置，根据当前对象的类型进行翻译。
     * <p>
     * 如果 strictMode 为 true，则会严格按照配置进行翻译，未找到对应值时会抛出异常。
     * 如果为 false，则会忽略未找到对应值的异常，继续处理下一个配置。
     *
     * @param strictMode 是否严格模式
     */
    default void processDictMapping(final boolean strictMode) {
        if (!allowDictMapping()) {
            return;
        }

        for (DictMapping<?, ?, ?> dictMapping : dictMapping()) {
            if (!strictMode) {
                // 非严格模式下，忽略翻译异常
                try {
                    dictMapping.process(TypeCaster.cast(this));
                } catch (DictTranslationException ignored) {
                    // 忽略翻译异常
                }
            } else {
                dictMapping.process(TypeCaster.cast(this));
            }
        }

    }

    /**
     * 是否包含字典编排配置
     *
     * @return true表示有编排配置，false表示没有
     */
    default boolean allowDictMapping() {
        return dictStrategy() == DictTranslateStrategy.MAPPING && dictMapping() != null && !dictMapping().isEmpty();
    }

    /**
     * 获取当前对象的字典翻译策略。
     * 默认为 {@link DictTranslateStrategy#ANNOTATION}，以保持向后兼容。
     *
     * @return 字典翻译策略
     */
    default DictTranslateStrategy dictStrategy() {
        return DictTranslateStrategy.ANNOTATION;
    }

    /**
     * 字典翻译策略枚举。
     */
    enum DictTranslateStrategy {
        /**
         * 仅使用 DictMapping 进行编排翻译。
         * 适用于有复杂、自定义翻译逻辑的场景，完全忽略 @DictField 注解。
         */
        MAPPING,
        /**
         * 仅使用 @DictField 注解进行翻译。
         * 这是默认策略，最基础、最通用的翻译方式。
         */
        ANNOTATION
    }
}
